近两年功能增加最多!Kubernetes 1.27 正式发布
太平洋时间 2023 年 4 月 11 日,Kubernetes 1.27 正式发布。此版本距离上版本发布时隔 4 个月,是 2023 年的第一个版本。
新版本中 release 团队跟踪了 60 个 enhancements,比之前版本都要多得多。其中 13 个功能升级为稳定版,29 个已有功能进行优化升级为 Beta,另有 18 个 Alpha 级别的功能,大多数为全新功能。本版本包含了很多重要功能以及用户体验优化,本文会在下一小节进行部分重要功能的详细介绍。
重要功能
镜像仓库切换 k8s.gcr.io 到 registry.gcr.io
KEP-1847:StatefulSet PVC 自动删除功能特性 Beta
KEP-3453:优化大型集群中 kube-proxy 的 iptables 模式性能
KEP-2831 和 KEP-647:APIServer 和 Kubelet 的 Tracing 功能 Beta
KEP-3077:上下文日志
KEP-1287:Pod 资源的纵向弹性伸缩
在之前的版本中,Pod API 不支持修改资源。也就是说,容器定义的资源限制和请求(如 CPU 和内存)是不可变的。在 1.25 版本中,CRI API 开始支持 Pod 资源限制的热更新。
在 Pod 的容器中添加了 resizePolicy 字段,以允许用户控制容器在资源变更时是否重启。
在容器状态中添加了 allocatedResources 字段,用于描述为 Pod 分配的节点资源。
在容器状态中添加了 resources 字段,用于报告应用于正在运行的容器的实际资源。
在 Pod 状态中添加了 resize 字段,用于描述请求调整 Pod 大小的状态。该字段可以是 Proposed(已提出),InProgress(进行中),Deferred(已延迟)或 Infeasible(不可行)。
KEP-3386:Kubelet 事件驱动 PLEG 升级为 Beta
压力测试需要在单个 Pod 中创建大量容器以生成 CRI 事件,并观察 latency 值是否超过 1 秒。
恢复测试则是为了验证 Kubelet 在重新启动后能否正确地更新容器状态。
而带退避逻辑的重试则是为了解决 CRI Runtime 宕机时 Kubelet 可能无法连接的问题。
KEP-3476:Volume Group 快照 Alpha(API)
KEP-3838 和 KEP-3521:Pod 调度就绪态功能增强
KEP-3243:Deployment 滚动更新过程中的调度优化
KEP-2876:使用通用表达式语言(CEL)来验证 CRD
x-kubernetes-validations:
- rule: "self.x <= self.maxLimit"
messageExpression: '"x exceeded max limit of " + string(self.maxLimit)'
KEP-2258:节点日志查询
v1.27 添加了 NodeLogQuery 特性门控 (Feature Gate),为集群管理员提供了使用 kubectl 流式查看节点日志的功能,无需登录节点。该功能目前是 Alpha,需要配置 kubelet 开启特性门控,同时还需要设置 enableSystemLogHandler 和 enableSystemLogQuery 为 true。在 Linux 上,我们假设系统服务日志可以通过 journald 获得。在 Windows 上,我们假设系统服务日志可以在应用程序日志提供程序中获得。在这两个操作系统中,还可以通过读取 /var/log/ 目录下的文件来获取日志。此功能对 Windows 的支持也在逐步完善,目前使用 Get-WinEvent 来获取系统和应用程序日志。
不仅如此,目前节点日志获取功能还支持了一些参数。其中 query 表示服务名,可指定 kubelet、containerd 等。patern 通过提供的 PERL 兼容正则表达式过滤日志条目。此外支持的参数还有 sinceTime、untilTime、tailLines、boot。
# Fetch kubelet logs from a node named node-1.example that have the word "error"
kubectl get --raw "/api/v1/nodes/node-1.example/proxy/logs/?query=kubelet&pattern=error"
KEP-3659:kubectl apply –prune 重新设计
--prune 在 v1.5 就作为 Alpha 功能引入,提供了自动清理 apply yaml 删除的部分对象,但是这个过程有些性能问题和缺陷,在一些情况下会造成对象泄漏。常见原因包括 allowlist (之前叫 whitelist)GVK 内容和 apply 内容不匹配,或者命名空间变化。命名空间操作变化的案例,比如第一次 apply 操作了命名空间 A 和 B;而第二次 apply 如果只 apply 命名空间 A 的资源,那么命名空间 B 的资源将不会被清理。
在 v1.27 中,kubectl 对 apply --prune 的功能进行了重新的设计,增加了 --applyset 配合使用,目前该功能仍然是 Alpha 级别,因此需要配置 KUBECTL_APPLYSET 环境变量为 1 或者 true,才能启用。在 kubectl apply 时,kubectl 会给对象添加 applyset.kubernetes.io/part-of 标签,在清理时会使用该标签。而为了满足更复杂的场景,还引入了 applyset.kubernetes.io/id 来标识 Parent 对象,以及 toolling、additional-namespaces 来帮助区分对象和增加命名空间信息等,更多详情请阅读 KEP 内容。
02
DaoCloud
参与功能
本次发布中, DaoCloud 重点贡献了 sig-node,sig-scheduling 和 kubeadm 相关内容,具体功能点如下:
[client-go] 修复尝试获取 leader lease 的等待时间的问题。
[调度] MinDomainsInPodTopologySpread 功能升级为 Beta。
[调度] 当任何调度程序插件在 PostFilter 中返回 unschedulableAndUnresolvable 状态时,该 Pod 的调度周期立即终止。
[日志] 迁移控制器使用 contextual logging。
[kubeadm] Kubeadm: 添加特性门控 EtcdLearnerMode,它允许将新增的控制节点的 etcd 作为学习者 Learner 加入,然后再升级为投票成员。
[节点] 如果 Pod 的 spec.terminationGracePeriodSeconds 属性值是负数,则会被修改为 1 秒的 terminationGracePeriodSeconds。
[节点] 添加了一个可以限制节点进行并行镜像下载数量的新功能。
[节点] 改进目前 Memory QoS 功能,优化了其在 cgroup v2 场景的适配性。
[节点] Kubelet:将 “--container-runtime-endpoint” 和 “--image-service-endpoint” 迁移到 kubelet 配置中。
[节点] Kubelet 默认允许 Pod 使用 net.ipv4.ip_local_reserved_ports sysctl,要求内核版本 3.16+。
[CLI] kubectl.kubernetes.io/default-container 标签正式 GA,主要用于 kubectl 的 logs、exec 等命令来决定默认容器。
在 v1.27 发布过程中,DaoCloud 参与上百个问题修复和功能研发,作为作者约有 90 个提交,详情请见贡献列表(该版本的两百多位贡献者中有来自 DaoCloud 的 15 位)。在 Kubernetes v1.27 的发布周期中,DaoCloud 的多名研发工程师取得了不少成就。其中,由张世明主要维护的项目 KWOK (Kubernetes Without Kubelet) 成为社区热点,并在大规模集群模拟方面有效地节约资源,提升效率。几位研发人员参与了 Kubernetes 官网的大量中文翻译工作,其中要海峰几乎包揽了近期官网博客的翻译,并成为 SIG-docs-zh 的维护者。此外,刘梦姣也是 SIG-docs 的维护者。在即将召开的 2023 年欧洲 KubeCon 上,殷纳将分享两个有趣的调度方向的主题,分别是 “Sig Scheduling Deep Dive” 和 “Building a Batch System for the Cloud with Kueue” (属于 Kubernetes Batch + HPC Day)。徐俊杰将分享 “Kubeadm Deep Dive” 的主题。
03
其他需要
了解的功能
APPS:
PodDisruptionBudget 之前不支持指定不健康 Pod 的处理方法,不健康 Pod 是指 Pod Running 但是状态不是 Ready。我们添加了一个新字段 unhealthyPodEvictionPolicy,允许用户指定这些不健康的 Pod 应该发生什么。该字段在 v1.27 中升级为 Beta。
"StatefulSetStartOrdinal" 功能升级为 Beta,默认允许在 StatefulSet 中配置起始序号。
Cronjob 支持 Timezone 功能 GA。
Enable the "StatefulSetStartOrdinal" feature gate in Beta.
DownwardAPIHugePages kubelet 功能已稳定 GA。
Indexed Job 的 API 验证已放宽,允许通过同时更改 parallelism 和 completions 来扩展或者缩小 Indexed Job,但是需要保持 parallelism == completions 同步修改。
API:
基于 Kubernetes v1.25 提供的 KEP-2876 CRD验证表达式语言,该功能增加一个新的资源 —— ValidatingAdmissionPolicy,允许在不使用 Validation Webhook 时实现字段验证。
在 1.27 中,Kubernetes 为聚合发现提供了 Beta 支持,通过 /api 和 /apis 发布集群支持的所有资源,而不是每个 Group 分别提供。
OpenAPIV3 功能 GA,允许 API 服务器发布 OpenAPI V3。社区建议使用 OpenAPI v3,v3 有诸多优势,其中包括 CustomResourceDefinition OpenAPI v3 验证模式的无损表示,而 OpenAPI v2 在 CRD validation 中做了有损转换。kubectl explain 也已经支持了 OpenAPI v3,但是需要配置环境变量 KUBECTL_EXPLAIN_OPENAPIV3 来启用。
将 SelfSubjectReview 提升为 Beta 级别。
Auth:
KMSv2 升级为 Beta,该功能在 1.27 中做了许多优化,比如:在插件 key ID 不变的情况下,重用 DEK 数据加密密钥,而当 Server 启动时,DEK 会重新随机生成。
添加了一个新的 Alpha API:ClusterTrustBundle(certificates.k8s.io/v1alpha1)。
AdmissionWebhookMatchConditions 功能已进入 Alpha:在 v1Beta 和 v1 API 中,为 ValidatingWebhookConfiguration 和 MutatingWebhookConfiguration 添加了 MatchConditions 字段。
将 LegacyServiceAccountTokenTracking 功能升级为 Beta,用于跟踪基于 Sercet 的 SA token 的使用情况。
CLI:
kubectl 的 --subresource 支持升级为 Beta,目前 subresource 只支持 status 和 scale。
改进 kubectl 插件解析以支持 non-shadowing 子命令。需要配置环境变量 KUBECTL_ENABLE_CMD_SHADOW=true 开启该功能,此时例如 kubectl create foo 执行会首先发现 create 没有 foo 子命令,kubectl 会自动尝试运行 kubectl-create-foo 插件。
网络:
当外部 cloud provider 支持提供双栈 IP 时,在 kubelet 中启用 CloudNodeIPs 功能,您就可以指定双栈的 --node-ip。该功能目前是 Alpha,需要手动开启。ValidatingAdmissionPolicy 添加了 matchConditions 字段,用来支持基于 CEL 的自定义匹配条件。该功能目前仍然是 Alpha 。
允许动态扩展可用于服务 Service 的 IP 数量。新增了 MultiCIDRServiceAllocator 功能,目前是 Alpha 级别。
新功能 ServiceNodePortStaticSubrange,以启用新的策略在 NodePort 服务端口分配器中,因此节点端口范围被细分,并且首选从上部分配动态分配的 NodePort 端口为服务。
添加了有关工作负载资源(Pod、ReplicaSets、Deployments、Jobs、CronJobs 或 ReplicationControllers)名称无效 DNS 标签的警告。
弹性:
HPAContainerMetrics 升级为 Beta,该功能允许 HorizontalPodAutoscaler 基于目标 Pod 中各容器 ContainerResource 类型的 metrics 来执行扩缩操作。
节点:
动态资源分配功能,使用功能 DynamicResourceAllocation。新增的 API 比 Kubernetes 现有的设备插件 Device Plugin 功能更加灵活。因为它允许 Pod 请求(声明)指定类型的资源,这些资源可以在节点级别、集群级别或任何其他用户自定义实现的模型中使用。
用户命名空间支持范围扩大,该功能仍然是 Alpha,但相比 v1.26 支持 StatefulSet。
GRPC 探针功能 GA。
Bump default API QPS limits for Kubelet.
Graduate Kubelet Topology Manager to GA.
提高 Kubelet 的默认 API QPS 限制,其中 kubeAPIQPS 和 kubeAPIBurst 都调大了 10 倍。
Kubelet 的拓扑管理器 Topology Manager 功能 GA。
seccomp profile 默认值升级至 GA 级别。
日志:
kube-proxy、kube-scheduler 和 kubelet 有 HTTP API,可以在运行时更改日志 Level。该功能也适用于 JSON 格式日志输出。
Metrics:
/metrics/slis 现在可用于控制平面组件,可以用来获取当前组件的健康检查指标。
Lease:
Kubernetes 组件选举现在仅支持使用 Lease。
调度:
调度器新增 Metric plugin_evaluation_total。该指标显示特定插件影响调度结果的次数。
调度框架在 Filter 和 Score 阶段可以利用 Skip 状态跳过该流程,以提升性能。在 PreFilter 阶段,如果 Plugin 返回 Skip 信息,那么在后续可以跳过执行该 Plugin 相应的 Filter 和 Score 阶段。
存储:
NewVolumeManagerReconstruction 功能升级为 Beta。这是 VolumeManager 的重构,允许 kubelet 在启动期间带上关于现有卷如何挂载的附加信息。
SELinuxMountReadWriteOncePod 功能升级为 Beta。该功能在卷挂载过程中使用正确的 SELinux 标签,相比逐个递归更改每个文件的方式,该功能加快了容器启动速度。
ReadWriteOncePod PV 访问模式功能升级为 Beta。此功能引入了一个新的 ReadWriteOncePod 访问模式,用于限制 PV 对单个节点上的单个 Pod 的访问。而 ReadWriteOnce 模式限制了单节点访问,但并不限制同一个节点的多个 Pod 同时访问。
CSINodeExpandSecret 功能升级为 Beta 级别。
04
版本标志
本次发布的主题是 。Kubernetes 是 "Chill Vibes" 放松的氛围。
这个灵感来源于最近一次发布过程中,在功能冻结后没有出现任何异常情况,这是我们在多次发布中唯一的一次。我们能够更加轻松地完成此版本的发布,原因在于幕后工作人员为改善发布管理付出了许多努力。这也正是本主题希望庆祝的内容:大家在为提升社区体验方面做出了很多努力。
特别感谢 Britnee Laverack 创造标志设计图案,并且她还设计了 Kubernetes 1.24: Stargazer 的标志设计图案。
05
升级注意事项
本节主要介绍 v1.27 中 API 变化,以及功能的移除以及废弃,废弃的功能通常会在 1-2 个版本之后移除。更多详情请查看 Kubernetes 在 v1.27 中移除的特性和主要变更。
Kubernetes 在 v1.27 中移除的特性和主要变更:https://kubernetes.io/zh-cn/blog/2023/03/17/upcoming-changes-in-kubernetes-v1-27/
其中需要重点关注的,IPv6DualStack 外部云供应商特性门控已被删除。(该功能在 1.23 版本中成为 GA,几个版本之前已删除所有其他组件的特性门控。)如果您仍然手动启用它,则必须立即停止。
k8s.gcr.io 重定向到 registry.k8s.io 相关说明
再次强调,Kubernetes 项目为了托管其容器镜像,使用社区拥有的一个名为 registry.k8s.io. 的镜像仓库。从 3 月 20 日起,所有来自过期 k8s.gcr.io 仓库的流量将被重定向到 registry.k8s.io。已弃用的 k8s.gcr.io 仓库未来最终将被关停。
其他需要注意的变化
CSIStorageCapacity 的 storage.k8s.io/v1beta1 API 版本在 v1.24 中已被弃用,将在 v1.27 中被移除。
移除 NetworkPolicyEndPort、LocalStorageCapacityIsolation、StatefulSetMinReadySeconds、IdentifyPodOS、DaemonSetUpdateSurge、EphemeralContainers、CSIInlineVolume、CSIMigration、ControllerManagerLeaderMigration 特性门控,这些特性大部分都是在 v1.25 之前的版本正式 GA。
kube-apiserver 移除了 --master-service-namespace 命令行参数。
kube-controller-manager 命令行参数 --enable-taint-manager 和 --pod-eviction-timeout 被移除。
kubelet 移除了命令行参数 --container-runtime,该参数目前只有一个可选值 "remote" 并在之前版本中废弃。
弃用了 Alpha 状态的 seccomp 注解 seccomp.security.Alpha.kubernetes.io/pod 和 container.seccomp.security.Alpha.kubernetes.io。
SecurityContextDeny 特性门控已经废弃,将在未来版本移除。
由于使用 golang 1.20.2 构建时遇到问题,Linux/arm 将不会在 Kubernetes 1.27 中发布。注意, arm64 仍然支持。
06
历史版本
Kubernetes 1.24 走向成熟的 Kubernetes
Kubernetes 1.22 颠覆你的想象:可启用 Swap,推出 PSP 替换方案,还有……
Kubernetes 1.21 震撼发布 | PSP 将被废除,BareMetal 得到增强
[1] 官方 Changelog
https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.27.md
本文作者
「DaoCloud 道客」架构师/ AD 团队 Leader
Kubernetes Kubeadm「SIG Cluster-Lifecycle」和 SIG Node, Reviewer
热门推荐
访问以下网址,或点击文末【阅读原文】直接下载
DaoCloud 公司简介
「DaoCloud 道客」云原生领域的创新领导者,成立于 2014 年底,拥有自主知识产权的核心技术,致力于打造开放的云操作系统为企业数字化转型赋能。产品能力覆盖云原生应用的开发、交付、运维全生命周期,并提供公有云、私有云和混合云等多种交付方式。成立迄今,公司已在金融科技、先进制造、智能汽车、零售网点、城市大脑等多个领域深耕,标杆客户包括交通银行、浦发银行、上汽集团、东风汽车、海尔集团、屈臣氏、金拱门(麦当劳)等。目前,公司已完成了 D 轮超亿元融资,被誉为科技领域准独角兽企业。公司在北京、南京、武汉、深圳、成都设立多家分公司及合资公司,总员工人数超过 350 人,是上海市高新技术企业、上海市“科技小巨人”企业和上海市“专精特新”企业,并入选了科创板培育企业名单。网址:www.daocloud.io
邮件:info@daocloud.io
电话:400 002 6898